home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / edit / pt20pc.zip / AUXCOM2.C < prev    next >
C/C++ Source or Header  |  1991-02-04  |  8KB  |  335 lines

  1. #include "pt.h"
  2. #include "io.h"
  3. #include "stdlib.h"
  4.  
  5. /* This procedure checks all the things we want to check every time */
  6. /* a mouse click or keystroke occurs.  This gives us a chance to */
  7. /* remove temporary things. */
  8.  
  9. void pascal
  10. /* XTAG:handleTempItems */
  11. handleTempItems()
  12. {
  13.     extern struct window *windowList;
  14.     extern int isMessage;
  15.  
  16.     /* erase old messages */
  17.     if( isMessage )
  18.         msg("", 1);
  19.  
  20.     /* remove temporary windows */
  21.     if( (windowList->state & 0x4) == 0x4 )
  22.         closeWindow(windowList, 0, 1);
  23. }
  24.  
  25. void pascal
  26. /* XTAG:redefine */
  27. redefine()
  28. {
  29.     extern unsigned char msgBuffer[];
  30.     extern unsigned char textBuffer[];
  31.     extern union REGS rin, rout;
  32.     extern int scrRows, scrCols;
  33.     extern int keyMap[];
  34.     extern int asciiMap[];
  35.     extern int mouseVec1[];
  36.     extern int mouseVec2[];
  37.     extern unsigned char buttonVector[];
  38.     extern struct event events[];
  39.     extern int descrFileId;
  40.  
  41.     unsigned char ch, scan, *p;
  42.     unsigned char keyCh, keyScan, changeType;
  43.     int cmdNumber, mmNumber, evhead, buttons, thisShift;
  44.  
  45.     msg(
  46. "          Redefine a key, a mouse button, or a mouse motion command?", 5);
  47.     p = getInput(
  48. "k-redefine key;  b-mouse button;  1,2-mouse motion 1 or 2; ",
  49.         "k", 1);
  50.     if( p == NULL ) {
  51.         msg("Redefinition cancelled", 1);
  52.         return;
  53.     }
  54.     changeType = *p;
  55.     switch( changeType ) {
  56.     case 'k':
  57.         msg(
  58. "                            Redefine a key", 5);
  59.         msg("Press key to redefine or ESC to cancel redefinition", 1);
  60.         keyCh = getKeystroke(&keyScan);
  61.         if( keyCh == '\033' )    /* ESCape */
  62.             goto cancelRedefine;
  63.         if( keyCh == 0 )
  64.             cmdNumber = keyMap[keyScan];
  65.         else if( keyCh != '\033' )
  66.             cmdNumber = asciiMap[keyCh];
  67.         else
  68.             cmdNumber = 60;    /* 60 is arbitrary */
  69.         break;
  70.  
  71.     case '1':
  72.     case '2':
  73.         sprintf(msgBuffer,
  74. "                    Redefine mouse motion command %c [#%d]",
  75.             changeType, (changeType=='1' ? 45 : 46) );
  76.         msg(msgBuffer, 5);
  77.         p = getInput(
  78.           "Direction [n,ne,e,se,s,sw,w,nw, RETURN for no motion]: ",
  79.           "", 0);
  80.         switch( *p ) {
  81.             default:
  82.             case '\0': mmNumber = 0; break;
  83.             case 'e': mmNumber = 3; break;
  84.             case 'w': mmNumber = 7; break;
  85.             case 'n':
  86.                 switch( *++p ) {
  87.                     default:
  88.                     case '\0': mmNumber = 1; break;
  89.                     case 'e': mmNumber = 2; break;
  90.                     case 'w': mmNumber = 8; break;
  91.                 }
  92.                 break;
  93.             case 's':
  94.                 switch( *++p ) {
  95.                     default:
  96.                     case '\0': mmNumber = 5; break;
  97.                     case 'e': mmNumber = 4; break;
  98.                     case 'w': mmNumber = 6; break;
  99.                 }
  100.                 break;
  101.         }
  102.         if( changeType == '1' )
  103.             cmdNumber = mouseVec1[mmNumber];
  104.         else
  105.             cmdNumber = mouseVec2[mmNumber];
  106.         break;
  107.  
  108.     case 'b':
  109.         sprintf(msgBuffer,
  110. "Click the mouse button to redefine (including Shift, Ctrl, or Alt)");
  111.         msg(msgBuffer, 1);
  112.         while( 1 ) {
  113.             if( isMouseEvent(0) ) {
  114.                 evhead = getMouseEvent();
  115.                 /* do not look at mouse movements */
  116.                 /* only button presses */
  117.                 if( events[evhead].mask != 0x1 )
  118.                     break;
  119.             }
  120.         }
  121.         buttons = events[evhead].buttons;
  122.         /* find the shift state of the keyboard */
  123.         rin.h.ah = 2;
  124.         int86(0x16, &rin, &rout);
  125.         /* mask of the Ins, Caps, Num, and Scroll states */
  126.         thisShift = rout.h.al & 0xF;
  127.         /* fix thisShift so that either shift keys implies shift */
  128.         /* shift over bit1 and OR bit0 with it */
  129.         thisShift = (thisShift>>1) | (thisShift&0x1);
  130.         /* get the command number from the table */
  131.         buttons += (thisShift<<3);
  132.         cmdNumber = buttonVector[buttons];
  133.         break;
  134.  
  135.     default:
  136.         goto cancelRedefine;
  137.     }
  138.  
  139.     msg(
  140. "RETURN: choose command to redefine, ESC: cancel, ARROW KEYS or number: select",
  141.             5);
  142.     while( 1 ) {
  143.         /* check for valid command number */
  144.         if( cmdNumber < 2 )
  145.             cmdNumber = 2;
  146.         else if( cmdNumber > FLASTOPTION )
  147.             cmdNumber = FLASTOPTION;
  148.         
  149.         /* display description for command cmdNumber */
  150.         readLine(descrFileId, 80L*(long)cmdNumber, &textBuffer[0], 0);
  151.         sprintf(msgBuffer, "%d:%s", cmdNumber, textBuffer);
  152.         msgBuffer[78] = '\0';
  153.         msg(msgBuffer, 1);
  154.  
  155.         /* read and interpret command */
  156.         ch = getKeystroke(&scan);
  157.         switch( ch ) {
  158.         case 0:    /* extended character */
  159.             switch ( scan ) {
  160.             case 72:    /* Cursor Up */
  161.                 cmdNumber--;
  162.                 break;
  163.             case 75:    /* Cursor Left */
  164.                 cmdNumber--;
  165.                 break;
  166.             case 77:    /* Cursor Right */
  167.                 cmdNumber++;
  168.                 break;
  169.             case 80:    /* Cursor Down */
  170.                 cmdNumber++;
  171.                 break;
  172.             default:
  173.                 break;
  174.             }
  175.             break;
  176.         case '\r':    /* RETURN */
  177.             goto endLoop;
  178.         case '\033':    /* ESCape */
  179.             sprintf(msgBuffer, "Redefinition cancelled");
  180.             goto ret;
  181.         case '0': case '1': case '2': case '3': case '4':
  182.         case '5': case '6': case '7': case '8': case '9':
  183.             cmdNumber = ch - '0';
  184.             /* use ``thisShift'' to count keystrokes */
  185.             thisShift = 1;
  186.             while( 1 ) {
  187.                 ch = getKeystroke(&scan);
  188.                 switch( ch ) {
  189.                 case '0': case '1': case '2': case '3':
  190.                 case '4': case '5': case '6': case '7':
  191.                 case '8': case '9':
  192.                     cmdNumber = 10*cmdNumber + ch - '0';
  193.                     if( ++thisShift < 3 )
  194.                         break;
  195.                     /* else drop through */
  196.                 default:
  197.                     goto endNumber;
  198.                 }
  199.             }
  200.         endNumber:
  201.         default:
  202.             break;
  203.         }
  204.     }
  205. endLoop:
  206.     switch( changeType ) {
  207.     case 'k':
  208.         if( keyCh == 0 ) {
  209.             keyMap[keyScan] = cmdNumber;
  210.             sprintf(msgBuffer,
  211.               "Extended key 0,%d [0x%X] defined to be command %d",
  212.               keyScan, keyScan, cmdNumber);
  213.         } else {
  214.             asciiMap[keyCh] = cmdNumber;
  215.             sprintf(msgBuffer,
  216.               "ASCII key %d [0x%X] defined to be command %d",
  217.               keyCh, keyCh, cmdNumber);
  218.         }
  219.         break;
  220.     case '1':
  221.     case '2':
  222.         sprintf(msgBuffer,
  223.         "The %s mouse motion %c command is redefined to command #%d",
  224.         *p, changeType, cmdNumber);
  225.         if( changeType == '1' )
  226.             mouseVec1[mmNumber] = cmdNumber;
  227.         else
  228.             mouseVec2[mmNumber] = cmdNumber;
  229.         break;
  230.     case 'b':
  231.         buttonVector[buttons] = (unsigned char)cmdNumber;
  232.         break;
  233.     }
  234.     goto ret;
  235.  
  236. cancelRedefine:
  237.     sprintf(msgBuffer, "Redefinition cancelled");
  238.  
  239. ret:
  240.     redrawBox(scrRows-2, 1, scrRows-2, scrCols-2);
  241.     updateScreen(scrRows-2, scrRows-2);
  242.     msg(msgBuffer, 1); 
  243. }
  244.  
  245. void pascal
  246. /* XTAG:restoreLastState */
  247. restoreLastState()
  248. {
  249.     extern unsigned char msgBuffer[];
  250.     extern int i43lines;
  251.     extern int debug;
  252.  
  253.     unsigned char *p;
  254.     int fid, lineNumber;
  255.     register int row1, row2;
  256.     int col1, col2;
  257.     struct window *w;
  258.  
  259.     fid = openls("pt.las", 0);
  260.     if( fid < 0 ) {
  261.         msg(
  262. "Cannot find \"pt.las\" containing the last state [Press any key to continue]",
  263.             1);
  264.         incon();
  265.         return;
  266.     }
  267.     setGWBuffer(1);    /* allocate the getWord buffer */
  268.     /* first get some state variables */
  269.     p = getWord(fid);
  270.     if( p == NULL ) {    /* check to be safe */
  271.         closels(fid);
  272.         return;
  273.     }
  274.     i43lines = atoi(p);
  275.     set43lines();
  276.     /* now get the windows */
  277.     while( 1 ) {
  278.         /* get the four corners  and the line number */
  279.         p = getWord(fid);
  280.         if( p == NULL )
  281.             break;
  282.         row1 = atoi(p);
  283.         if( row1 < 0 )
  284.             row1 = 0;
  285.         else if( i43lines ) {
  286.             if( row1 > 40 )
  287.                 row1 = 40;
  288.         } else {
  289.             if( row1 > 22 )
  290.                 row1 = 22;
  291.         }
  292.         col1 = atoi(getWord(fid));
  293.         if( col1 < 0 )
  294.             col1 = 0;
  295.         if( col1 > 69 )
  296.             col1 = 69;
  297.         row2 = atoi(getWord(fid));
  298.         if( row1 + 2 > row2 )
  299.             row2 = row1 + 2;
  300.         if( row2 < 0 )
  301.             row2 = 0;
  302.         else if( i43lines ) {
  303.             if( row2 > 42 )
  304.                 row2 = 42;
  305.         } else {
  306.             if( row2 > 24 )
  307.                 row2 = 24;
  308.         }
  309.         col2 = atoi(getWord(fid));
  310.         if( col1 + 10 > col2 )
  311.             col2 = col1 + 10;
  312.         if( col2 < 0 )
  313.             col2 = 0;
  314.         if( col2 > 79 )
  315.             col2 = 79;
  316.         lineNumber = atoi(getWord(fid));
  317.  
  318.         /* get the file name last */
  319.         p = getWord(fid);
  320.         if( access(p, 0) == -1 ) {
  321.             sprintf(msgBuffer,
  322. "Cannot find \"%s\" in previous state [Press any key to continue]", p);
  323.             msg(msgBuffer, 1);
  324.             incon();
  325.         } else {
  326.             w = createWindow(p, row1, col1, row2, col2,
  327.                 CRBOTTOM, 0);
  328.             if( w != NULL )
  329.                 doGoto(w, lineNumber);
  330.         }
  331.     }
  332.     setGWBuffer(0);    /* free the getWord buffer */
  333.     closels(fid);
  334. }
  335.